'use strict'

import { app, protocol, BrowserWindow, Menu, Tray, nativeImage, dialog } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
import path from 'path'
const isDevelopment = process.env.NODE_ENV !== 'production'

app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors')
// 忽略证书相关错误
app.commandLine.appendSwitch('ignore-certificate-errors')

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

// 开机自启动
// app.setLoginItemSettings({
//   openAtLogin: true,
//   path: process.execPath,
//   args: []
// })

let tray: Tray = null as any

declare const __static: string

async function createWindow () {
  // Create the browser window.
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      webSecurity: false,
      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true
    }
  })

  setTray()

  if ((process.platform === 'darwin' && app.getLoginItemSettings().wasOpenedAtLogin) || process.argv.includes('--autostart')) {
    if (process.platform === 'darwin') {
      win.minimize()
    } else {
      win.hide()
    }
  } else {
    win.maximize()
  }

  const gotTheLock = app.requestSingleInstanceLock()
  if (!gotTheLock) {
    app.quit()
  } else {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
      // 当运行第二个实例时,将会聚焦到mainWindow这个窗口
      if (win) {
        if (win.isMinimized()) win.restore()
        win.focus()
        win.show()
      }
    })
  }

  win.on('close', function (e) {
    e.preventDefault()
    dialog.showMessageBox(win, {
      type: 'info',
      title: 'Information',
      defaultId: 0,
      message: '确定要关闭吗？',
      buttons: ['最小化到托盘', '直接退出']
    }).then(({ response }) => {
      if (response === 0) {
        if (process.platform === 'darwin') {
          win.minimize()
        } else {
          win.hide()
        }
      } else {
        app.exit()
      }
    })
  })

  // app.on('quit', function (e) {
  //   app.quit()
  // })

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // Load the url of the dev server if in development mode
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string)
    if (!process.env.IS_TEST) win.webContents.openDevTools()
  } else {
    Menu.setApplicationMenu(null)
    createProtocol('app')
    // Load the index.html when not in development
    win.loadURL('app://./index.html')
  }

  function setTray () {
    // const tray = new Tray(nativeImage.createFromDataURL(
    //   ''
    // ))
    tray = new Tray(path.join(__static, './icon.png'))
    const contextMenu = Menu.buildFromTemplate([
      {
        label: '退出',
        click: () => {
          app.exit()
        }
      }// 我们需要在这里有一个真正的退出（这里直接强制退出）
    ])
    tray.setToolTip('玖钉文档系统')
    tray.setContextMenu(contextMenu)
    tray.on('click', () => { // 我们这里模拟桌面程序点击通知区图标实现打开关闭应用的功能
      // win.isVisible() ? win.hide() : win.show()
      // win.isVisible() ? win.setSkipTaskbar(false) : win.setSkipTaskbar(true)
      if (process.platform === 'darwin') {
        win.maximize()
        win.show()
      } else {
        win.show()
      }
    })
  }
}

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    // Install Vue Devtools
    // try {
    //   await installExtension(VUEJS_DEVTOOLS)
    // } catch (e) {
    //   console.error('Vue Devtools failed to install:', e.toString())
    // }
  }
  createWindow()
})

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}
